#ifndef _WX_GTK_DND_H_
#define _WX_GTK_DND_H_

#include "wx/icon.h"

#define wxDROP_ICON(name)   wxICON(name)

class wxDropTarget: public wxDropTargetBase {
  public:
    wxDropTarget( wxDataObject *dataObject = ( wxDataObject* ) NULL );

    virtual wxDragResult OnDragOver( wxCoord x, wxCoord y, wxDragResult def );
    virtual bool OnDrop( wxCoord x, wxCoord y );
    virtual wxDragResult OnData( wxCoord x, wxCoord y, wxDragResult def );
    virtual bool GetData();
    GdkAtom GetMatchingPair();

    void RegisterWidget( GtkWidget *widget );
    void UnregisterWidget( GtkWidget *widget );

    GdkDragContext     *m_dragContext;
    GtkWidget          *m_dragWidget;
    GtkSelectionData   *m_dragData;
    guint               m_dragTime;
    bool                m_firstMotion;

    void SetDragContext( GdkDragContext *dc ) { m_dragContext = dc; }
    void SetDragWidget( GtkWidget *w ) { m_dragWidget = w; }
    void SetDragData( GtkSelectionData *sd ) { m_dragData = sd; }
    void SetDragTime( guint time ) { m_dragTime = time; }
};

class wxDropSource: public wxDropSourceBase {
  public:
    wxDropSource( wxWindow *win = ( wxWindow * )NULL,
                  const wxIcon &copy = wxNullIcon,
                  const wxIcon &move = wxNullIcon,
                  const wxIcon &none = wxNullIcon );
    wxDropSource( wxDataObject& data,
                  wxWindow *win,
                  const wxIcon &copy = wxNullIcon,
                  const wxIcon &move = wxNullIcon,
                  const wxIcon &none = wxNullIcon );

    virtual ~wxDropSource();
    virtual wxDragResult DoDragDrop( int flags = wxDrag_CopyOnly );
    void RegisterWindow();
    void UnregisterWindow();
    void PrepareIcon( int action, GdkDragContext *context );
    GtkWidget       *m_widget;
    GtkWidget       *m_iconWindow;
    GdkDragContext  *m_dragContext;
    wxWindow        *m_window;
    wxDragResult     m_retValue;
    wxIcon           m_iconCopy,
                     m_iconMove,
                     m_iconNone;
    bool             m_waiting;
  private:
    void SetIcons( const wxIcon& copy, const wxIcon& move, const wxIcon& none );
};

#endif
